package com.testing.sqlTest;

import java.io.IOException;
import java.sql.*;
import java.util.*;

/**
 * @Classname MysqlUtils
 * @Description 用于完成mysql数据库操作的工具类
 * @Date 2021/5/21 22:08
 * @Created by 特斯汀Roy
 */
public class MysqlUtils {

    //成员变量 Connection连接，用于其他方法来进行数据库的操作。
    private Connection myCon;

    public void createCon(String jdbcUrl, String user, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            myCon = DriverManager.getConnection(jdbcUrl, user, password);
        } catch (Exception e) {
            System.out.println("创建数据库连接失败！请检查配置");
            e.printStackTrace();
        }
    }

    /**
     * 重载createCOn方法，从pro文件中加载配置信息
     */
    public void createCon(){
        Properties pro=new Properties();
        try {
            pro.load(MysqlUtils.class.getResourceAsStream("/inter.properties"));
            Class.forName("com.mysql.jdbc.Driver");
            String jdbcurl=pro.get("jdbcUrl").toString();
            String user=pro.get("user").toString();
            String pwd=pro.get("password").toString();
            myCon = DriverManager.getConnection(jdbcurl,user ,pwd);
        } catch (Exception e) {
            System.out.println("配置文件加载失败");
            System.out.println("创建数据库连接失败");
            e.printStackTrace();
        }


    }


    /**
     * 验证登录的方法
     *
     * @param user     用户名
     * @param password 密码
     * @return 登录是否成功的结果
     */
    public boolean checkLogin(String user, String password) {
        createCon();
        try {
            Statement statement = myCon.createStatement();
            String sql = "select * from userinfo where username='" + user + "' and `password`='" + password + "';";
            System.out.println(sql);
            //查询结果集resultset
            ResultSet resultSet = statement.executeQuery(sql);
            //类似于集合中的iterator，只不过这里的next()同时完成了判断和向下取值。
            //如果只是验证登录成功，能够查询到就能够作为判断条件。
            if (resultSet.next()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            System.out.println("数据库查询失败");
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 获取通过sql查询到的所有结果，存储为一个list。
     *
     * @param sql
     * @return
     */
    public List<Map<String, String>> querySql(String sql) {
        createCon();
        try {
            Statement statement = myCon.createStatement();
            //查询结果集resultset
            ResultSet resultSet = statement.executeQuery(sql);
            ResultSetMetaData metaData = resultSet.getMetaData();
            List<Map<String, String>> infoList = new ArrayList<>();
            //外层循环，每次取一行
            while (resultSet.next()) {
                //每一次创建一个map用于存储这一行的信息。
                Map<String, String> lineInfo = new HashMap<>();
                //循环元数据信息的每一个字段
                //内层循环，每一行都按照表头里的每个字段取值
                //数据库元组信息计数是从1开始的。
                for (int i = 1; i <= metaData.getColumnCount(); i++) {
                    lineInfo.put(metaData.getColumnName(i), resultSet.getString(metaData.getColumnName(i)));
                }
                //每次将map中的一行信息，存储到list里面
                infoList.add(lineInfo);
            }
//        最后这个list就是最终所有的查询结果
            System.out.println(infoList);
            return infoList;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return new ArrayList<>();
        }
    }

    public boolean proCheckLogin(String user,String password)  {
        createCon();
        //jdbc进行mysql存储过程调用的格式：  call 方法名(?,?) 一个问号表示一个参数。
        try {
            CallableStatement callableStatement = myCon.prepareCall("call login(?,?)");
            callableStatement.setString(1,user);
            callableStatement.setString(2,password);
            //通过执行存储过程，得到结果集
            ResultSet resultSet = callableStatement.executeQuery();
            if(resultSet.next()){
                return true;
            }else{
                return false;
            }
        } catch (SQLException excpetion) {
            excpetion.printStackTrace();
            System.out.println("数据库查询存储过程失败，请检查。");
            return false;
        }


    }


}


